
#include"Slist.h"

SLTNode* BuyListNode(SLTDateType x)
{
	SLTNode* newnode=(SLTNode*)malloc(sizeof(SLTNode));
	if(newnode==NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data=x;
	newnode->next=NULL;

	return newnode;
}

void SListPrint(SLTNode* phead)
{
	SLTNode* cur=phead;
	while(cur!=NULL)
	{
		printf("%d->",cur->data);
		cur=cur->next;
	}
	printf("NULL\n");
}


void SListPushBack(SLTNode** pphead,SLTDateType x)
{
	SLTNode* newnode=BuyListNode(x);
	
	if(*pphead==NULL)
	{
		*pphead=newnode;
	}
	else
	{
		SLTNode* tail=*pphead;
		while(tail->next!=NULL)
		{
			tail=tail->next;
		}

	

		tail->next=newnode;
	}
	
}


void SListPushFront(SLTNode** pphead,SLTDateType x)
{
	SLTNode* newnode=BuyListNode(x);

	newnode->next=*pphead;
	*pphead=newnode;
}



void SListPopBack(SLTNode** pphead)
{
	assert(*pphead!=NULL);

	if((*pphead)->next==NULL)
	{
		free(*pphead);
		*pphead=NULL;
	}
	else
	{
		SLTNode* prev=NULL;
		SLTNode* tail=*pphead;
		while(tail->next)
		{
			prev=tail;
			tail=tail->next;
		}

		free(tail);
		tail=NULL;

		prev->next=NULL;
	}

	
}



//void SListPopBack(SLTNode** pphead)
//{
//	
//	SLTNode* tail=*pphead;
//	while(tail->next->next)
//	{
//		
//		tail=tail->next;
//	}
//
//	free(tail->next);
//
//	tail->next=NULL;
//}



void SListPopFront(SLTNode** pphead)
{
	SLTNode* next;
	assert(*pphead!=NULL);

	next=(*pphead)->next;
	free(*pphead);
	*pphead=next;
}



SLTNode* SListFind(SLTNode* phead,SLTDateType x)
{
	SLTNode* cur=phead;

	while(cur)
	{
		if(cur->data==x)
		{
			return cur; 
		}
		else
		{
			cur=cur->next;
		}

	}
	return NULL;
}



void  SListInsert(SLTNode** pphead,SLTNode* pos,SLTDateType x)
{
	SLTNode* newnode=BuyListNode(x);

	if(*pphead==pos)
	{
		newnode->next=*pphead;
		*pphead=newnode;
	}
	else
	{
		SLTNode* posPrev=*pphead;
		while(posPrev->next!=pos)
		{
			posPrev=posPrev->next;
		}

		posPrev->next=newnode;
		newnode->next=pos;
	}
}



void SListInsertAfter(SLTNode* pos,SLTDateType x)
{
	SLTNode* newnode=BuyListNode(x);
	newnode->next=pos->next;
	pos->next=newnode;
}



void  SListErase(SLTNode** pphead,SLTNode* pos)
{
	if(*pphead==pos)
	{
		*pphead=pos->next;
		free(pos);
	}
	else
	{
		SLTNode* prev=*pphead;
		while(prev->next!=pos)
		{
			prev=prev->next;
		}

		prev->next=pos->next;
		free(pos);

	}
}


void  SListEraseAfter(SLTNode* pos)
{
	assert(pos->next);
	SLTNode* next=pos->next;
	pos->next=next->next;
	free(next);

}


void  SListDestory(SLTNode** pphead)
{
	assert(pphead);
	SLTNode* cur=*pphead;
	while(cur)
	{
		SLTNode* next=cur->next;
		free(cur);
		cur=next;
	}

	*pphead=NULL;
}